<?php
/**
 * CK框架 模型关联连接类 考虑到效率，该类已废弃。
 * @author wujibing<283109896@qq.com>
 * @version   3.0
 * @category   CkFrameWork
 * @package  CkFrameWork
 * @subpackage lib
 */
class moduleLink
{
	/**
	 * 一对一关系 该关系是默认的
	 * @var int
	 */
	const HAS_ONE = 0;
	/**
	 * 一对多关系
	 * @var int
	 */
	const HAS_MORE = 1;
	/**
	 * 多对多查询
	 * @var int
	 */
	const MORE_MORE = 2;
	/**
	 * link模块的数组
	 * @var array
	 */
	private $_links = array();
	
	public function __construct(module $module)
	{
		$link = $module->getLink();
		$moduleLink = null;
		if($link) foreach ($link as $key => $value)
		{
			!$value['linkKey'] ? $value['linkKey'] = $module->getPrimary() : '';
			switch ($value['linkType'])
			{
				case moduleLink::HAS_ONE:
					$moduleLink = new moduleLinkHasOne($key, $value['className'], $value['foreignKey'], $value['linkKey'], $value['queryField'], $value['condtionCallBack']);
				break;
				default:
					$moduleLink = new moduleLinkBase($key, $value['className'], $value['foreignKey'], $value['linkKey'], $value['queryField'], $value['condtionCallBack']);
			}
			$this->_links[$key] = $moduleLink;
		}
	}
	/**
	 * 查询通知
	 */
	public function getData($data)
	{
		if($data) foreach ($data as $key => $value)
		{
			foreach ($this->_links as $lKey => $lValue)
			{
				$lValue->query($value);
				$data[$key] = $value;
			}
		}
	}
}

class moduleLinkBase
{
	/**
	 * 所属模块
	 * @var module
	 */
	protected $_module;
	/**
	 * 关联名称
	 * @var string
	 */
	protected $_name;
	/**
	 * 关联的字段
	 * @var string
	 */
	protected $_linkkey;
	/**
	 * 外键字段
	 * @var string
	 */
	protected $_foreignKey;
	/**
	 * 查询字段
	 * @var array
	 */
	protected $_queryField;
	/**
	 * 查询条件回传方法 便于where等信息
	 * 该方法必须带一个参数 回调的类型 该值包含 query add update delete
	 * @var string
	 */
	protected $_condtionCallBack;
	/**
	 * 构造函数
	 */
	public function __construct($name,$moduleName,$linkKey,$foreignKey,$queryField = array(),$condtionCallBack='')
	{
		if(!$queryField)
		{
			$queryField = '*';
		}
		$this->_name = $name;
		$moduleName = $moduleName .'_M';
		$this->_module = new $moduleName();
		if(!$linkKey)
		{
			$linkKey = $this->_module->getPrimary();
		}
		$this->_linkKey = $linkKey;
		$this->_foreignKey = $foreignKey;
		$this->_queryField = $queryField;
		$this->_condtionCallBack = $condtionCallBack;
	}
	/**
	 * 查询关联
	 * @param array $data
	 */
	public function query(&$data)
	{
		$value = $data[$this->_foreignKey];
		if(!$value)
		{
			return;
		}
		$this->_module->queryField($this->_queryField)->where($this->_linkKey)->equal($value);
		//条件回传 例如排序或者其他条件查询
		$this->_condtionCallBack ? call_user_func_array(array($this->_module,$this->_condtionCallBack), array('query')) : '';
		//处理结果
		$data[$this->_name] = $this->getQuery();
	}
	/**
	 * 获得结果集合
	 * 默认的获得多结果集
	 * 用户可以继承moduleLinkBase类来更换获得结果
	 */
	protected function getQuery()
	{
		return $this->_module->query();
	}
}
/**
 * hasOne的处理
 * @author admin
 *
 */
class moduleLinkHasOne extends moduleLinkBase
{
	protected function getQuery()
	{
	    return $this->_module->getOne();
	}
}